package cn.xyy.bcode.dao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import cn.xyy.bcode.domain.MonthBills;
import cn.xyy.common.table.MonthBillsTableUtil;
import cn.xyy.jdbc.BaseDao;

/**
 * 账单数据持久层
 * 
 * <p>
 * 自定义jdbc @Table注解不支持对象操作分区表，因此需要手写sql语句
 * </p>
 * 
 * @author xyy
 *
 */
@Repository
public class MonthBillsDao extends BaseDao {

	public int insert(MonthBills item) {
		StringBuilder sql = new StringBuilder();
		sql.append("insert into ");
		sql.append("" + item.getTargetTable() + "");
		sql.append(" (month_bills_id,serial_number,pay_money,machine_serial_no,bill_date,bills_info,bill_comment) ");
		sql.append(" values(?,?,?,?,?,?,?) ");

		List<Object> args = new ArrayList<Object>();
		args.add(item.getMonthBillsId());
		args.add(item.getSerialNumber());
		args.add(item.getPayMoney());
		args.add(item.getMachineSerialNo());
		args.add(item.getBillDate());
		args.add(item.getBillsInfo());
		args.add(item.getBillComment());

		return super.insertOrUpdateOrDelete(sql.toString(), args.toArray());
	}

	public MonthBills selectBySerialNumber(MonthBills item) {
		StringBuilder sql = new StringBuilder();
		sql.append("select * from ");
		sql.append("" + item.getTargetTable() + "");
		sql.append(" where serial_number=? ");

		List<Object> args = new ArrayList<Object>();
		args.add(item.getSerialNumber());
		return super.selectOne(sql.toString(), args.toArray(), MonthBills.class);
	}

	public List<MonthBills> selectList(MonthBills monthBills) {
		// 先获取两个日期之间的所有表名
		List<String> tables = MonthBillsTableUtil.getTablesByRangeQuery(monthBills.getStartTime(),
				monthBills.getEndTime());
		// 提前创建一个字符串对象保存SQL语句
		StringBuffer sql = new StringBuffer();
		// 如果查询的两个日期是同一张表，则直接生成 BETWEEN AND 的SQL语句
		if (tables.size() == 1) {
			sql.append("select * from ").append(tables.get(0)).append(" where bill_date BETWEEN '")
					.append(monthBills.getStartTime()).append("' AND '").append(monthBills.getEndTime()).append("';");
			// 如果本次范围查询的两个日期之间有多张表
		} else {
			// 则用for循环遍历所有表名
			for (String table : tables) {
				// 对于第一张表则只需要查询开始日期之后的数据
				if (table.equals(tables.get(0))) {
					sql.append("select * from ").append(table).append(" where bill_date > '")
							.append(monthBills.getStartTime()).append("' union all ");
				}
				// 对于最后一张表只需要查询结束日期之前的数据
				else if (table.equals(tables.get(tables.size() - 1))) {
					sql.append("select * from ").append(table).append(" where bill_date < '")
							.append(monthBills.getEndTime()).append("';");
					// 对于其他表则获取所有数据
				} else {
					sql.append("select * from ").append(table).append("' union all ");
				}
			}
		}
		return super.select(sql.toString(), MonthBills.class);

	}

}
